package com.miya.plugin1;

import android.app.Application;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 由插件内部去找
 * <p>
 * 思路：
 * 1. AssetManager的addAssetPath是添加apk中的资源的
 * 2. 新建一个AssetManager，来加载插件中的资源，既然java代码由外部加载成功了，那么这里的代码也是由宿主执行的. 而插件地址就写插件的绝对地址
 * 3. 直接把getResources的方法从Activity中替换掉，使用这里的getResources
 */
public class LoadResourcesUtils {

    private static Resources resources;

    /**
     * @param application 必须传入Application，不然的话，替换不对
     */
    public static Resources getResources(Application application) {
        if (resources == null) {
            initResources(application);
        }
        return resources;
    }

    private static void initResources(Application application) {
        if (!checkExist(application)) {
            return;
        }
        try {
            //AssetManager 的构造函数被hide了，但是确实是public的，可以调用
            AssetManager assetManager = AssetManager.class.newInstance();
            Method method = assetManager.getClass().getMethod("addAssetPath", String.class);
            method.setAccessible(true);
            method.invoke(assetManager, getApkFile(application).getAbsolutePath());

            Resources hostResources = application.getResources();
            resources = new Resources(assetManager, hostResources.getDisplayMetrics(), hostResources.getConfiguration());
        } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    //检查插件的file地址是否存在
    private static boolean checkExist(Context context) {
        return getApkFile(context).exists();
    }


    private static File getApkFile(Context context) {
        return new File(context.getCacheDir(), "plugin1-release.apk");
    }

}
